package com.panshi.service;

import com.panshi.mapper.IMessageMapper;
import com.panshi.mapper.IUserMapper;
import com.panshi.tool.MailUtils;
import com.panshi.vo.qa.Messag;
import com.panshi.vo.qa.QuestionAudit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;

/**
 *   定义一个交换器名称：广播消息，只要有人绑定了这个广播器，所有人都能接受到消息
 * 
 * @author Administrator
 *
 */
@Slf4j
@Configuration
@Service
public class QuestionAuditService {

	@Autowired
	IMessageMapper messageMapper;

	@Autowired
	IUserMapper userMapper;
	
	@Autowired
	RabbitTemplate rabbitTemplate;
	
	//定义一个交换器名称（广播，扇形）
	public static final String EX_NAME="question-audit-exchange-fanout";
	//定义一个交换器名称绑定的消息队列名称1
	public static final String SEND_MAIL="send-mail";
	//定义一个交换器名称绑定的消息队列名称2
	public static final String SEND_INTERIOR_MESSAGE="send-interior-message";

	/**
	  *    发送消息到交换器中，然后交换器分发到绑定这个交换器的队列
	 * @param questionAudit
	 */
	public void send(QuestionAudit questionAudit) {
		//发送mq到一个交换器中，第一个参数是交换机名称，第二参数是路由器名称（这个名称可以指定或者为空字符串）
		rabbitTemplate.convertAndSend(EX_NAME,"", questionAudit);
	}
	
	/**
	  * 创建第一个消息端监听器，绑定一个广播交换机以及队列名称
	  * 如果下面的交换器名称，路由名称不存在，系统在启动的时候会自动创建
	 * @param questionAudit
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(value =@Queue(name = SEND_MAIL),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.FANOUT))//指定交换器名称且是一个扇形交换器，相关于一个广播
	})
	public void receiveFANOUT1(QuestionAudit questionAudit) {
		//获取用户id
		int userId = questionAudit.getQUserId();
		//查询用户邮箱
		String email = userMapper.queryMail(userId);
		//标题
		String title = "有贝口腔网 | 问题审核提醒";
		//内容
		String content = "";
		content += "<h1 style='width: 150px;margin: 0px auto;color: #009F95;'>问题审核消息</h1>";
		content += "<br/>";
		content += "<div  style='width: 300px;margin: 0px auto;'>您发布的问题:</div>";
		content += "<div  style='width: 300px;margin: 0px auto;'>《"+questionAudit.getQContent()+"》</div>";

		if(questionAudit.getQState() == 2){
			content += "<br/>";
			content += "<div  style='width: 300px;margin: 0px auto;'>审核通过啦 ^_^ !</div>";
		}else if(questionAudit.getQState() == 3){
			content += "<br/>";
			content += "<div  style='width: 300px;margin: 0px auto;'>审核没有通过 ~……~ !</div>";
		}

		try {
			MailUtils.sendMail(email,title,content);
			log.info("邮件发送成功！");
			log.info("email：{}",email);
			log.info("title：{}",title);
			log.info("content：{}",content);
		}catch (Exception e){
			e.printStackTrace();
			log.info("邮件发送失败 ~……~！");
		}

	}
	
	/**
	  * 创建第二消息端监听器，绑定一个广播交换机以及队列名称
	 * @param questionAudit
	 */
	@RabbitListener(bindings = {
			 @QueueBinding(value =@Queue(name = SEND_INTERIOR_MESSAGE),//指定队列名称
			               exchange =@Exchange(name = EX_NAME,type = ExchangeTypes.FANOUT))//指定交换器名称且是一个扇形交换器，相关于一个广播
	})
	public void receiveFANOUT2(QuestionAudit questionAudit) {
		//创建站内消息
		Messag messag = new Messag();

		//标题
		String title = questionAudit.getQContent();
		messag.setTitle(title);
		//内容
		String content = questionAudit.getQContent();
		messag.setContent(content);
		//审核状态
		int checkState = questionAudit.getQState();
		messag.setCheckState(checkState);
		//站内消息类型（0:公共 1:问题 2:回答 3:文章）
		int checkType = 1;//(1：代表问题)
		messag.setCheckType(checkType);
		//审核描述
		String checkDescribe = questionAudit.getCheckDescribe();
		messag.setCheckDescribe(checkDescribe);
		//所属用户
		int userId = questionAudit.getQUserId();
		messag.setUserId(userId);

		//添加站内消息
		messageMapper.addMessage(messag);

		log.info("站内消息发送完成 ^_^！");
		log.info("messag:{}",messag);
	}

}
